﻿using System.Collections.Generic;
using UnityEngine;

namespace Script.Framework
{
    /// <summary>
    /// 每个模块的基类
    ///     1. 保存自身注册的一系列消息
    /// </summary>
    public class ManagerBase : MonoBase
    {
        /// <summary>
        /// 存储 消息的事件码 和 那个脚本 关联 的 字典
        /// 
        /// 角色模块 有一个动作是 移动
        ///         移动模块需要关心这个事件
        ///         动画模块 也需要关心  控制角色播放动画    
        ///         音效模块 也需要关心  控制角色移动的音效播放 走路声
        /// </summary>
        private readonly Dictionary<int, List<MonoBase>> dict = new Dictionary<int, List<MonoBase>>();

        /// <summary>
        /// 处理自身的消息
        /// </summary>
        /// <param name="eventCode"></param>
        /// <param name="message"></param>
        public override void Execute(int eventCode, object message)
        {
            if (!dict.ContainsKey(eventCode))
            {
                Debug.LogWarning("没有注册：" + eventCode);

                Debug.Log("List 的 长" + dict.Count);
                foreach (var i in dict)
                {
                    Debug.Log("dict 里有" + i.Key);
                    Debug.Log("dict 里有" + i.Value);
                }

                return;
            }

            // 一但注册过这个消息 给所有的脚本 发过去
            List<MonoBase> list = dict[eventCode];

            foreach (MonoBase t in list)
            {
                t.Execute(eventCode, message);
            }
        }

        /// <summary>
        /// 添加事件
        /// </summary>
        /// <param name="eventCode"></param>
        /// <param name="mono"></param>
        protected void  Add(int eventCode, MonoBase mono)
        {
            List<MonoBase> list;

            // 之前没有注册过
            if (!dict.ContainsKey(eventCode))
            {
                list = new List<MonoBase> {mono};
                dict.Add(eventCode, list);


                //Debug.Log("注册成功" + eventCode);
                //Debug.Log("List 的 长" + dict.Count);

                //foreach (var i in dict)
                //{
                //    Debug.Log("dict 里有" + i.Key);
                //    Debug.Log("dict 里有" + i.Value);
                //}

                return;
            }

            // 之前注册过
            list = dict[eventCode];
            list.Add(mono);
        }

        /// <summary>
        /// 添加多个事件
        ///     一个脚本关心多个事件
        /// </summary>
        /// <param name="eventCodes"></param>
        /// <param name="mono"></param>
        public void Add(int[] eventCodes, MonoBase mono)
        {
            foreach (int t in eventCodes)
            {
                Add(t, mono);
            }
        }

        /// <summary>
        /// 移除事件
        /// </summary>
        /// <param name="eventCode"></param>
        /// <param name="mono"></param>
        private void Remove(int eventCode, MonoBase mono)
        {
            // 没注册过 没法移除 报个警告
            if (!dict.ContainsKey(eventCode))
            {
                Debug.LogWarning("没有这个事件" + eventCode + "注册");
                return;
            }

            List<MonoBase> list = dict[eventCode];

            if (list.Count == 1)
            {
                dict.Remove(eventCode);
            }
            else
            {
                list.Remove(mono);
            }
        }

        /// <summary>
        /// 移除多个事件
        /// </summary>
        /// <param name="eventCodes"></param>
        /// <param name="mono"></param>
        public void Remove(int[] eventCodes, MonoBase mono)
        {
            foreach (int t in eventCodes)
            {
                Remove(t, mono);
            }
        }
    }
}